문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 플린 분류 (문단 편집) ==== SIMD [[컴파일러#s-1.2|Intrinsics]] ==== 위에서 소개한 어셈블리 명령어는 충분히 강력하지만 사용자의 입장에서는 그리 직관적이지는 않다. 게다가 관리하기도 어렵다. 그래서 보다 직관적인 방법으로 어셈블리 명령어를 사용할 수 있도록 도와주는 게 바로 Intrinsics다. C/C++ 계열이 메이저이면서도 하드웨어와 상대적으로 친숙한 언어이므로 Intrinsics는 주로 C나 C++ 형식을 따른다. 경우에 따라 디스어셈블 해보면 낭비되는 Instruction도 있지만, 생산성이나 유지, 보수의 측면에서는 훨씬 뛰어나기 때문에 성능 이슈가 그 미세한 차이가 유의미할 정도로 중요한 게 아니라면 일반적으로는 Intrinsics를 사용한다. 인라인 어셈블리 대비 장점은 32비트나 64비트의 코드패스를 별도로 구분 할 필요가 없으며 컴파일러간 호환성이 유지되며 [* 어셈블러는 GCC의 GAS나 MSVC의 MASM, 그 외 FASM, YASM등 다른 어셈블러는 비슷하기만 할 뿐이지 문법이 전부 다르다.] Loop unrolling 과 같은 추가적인 컴파일러의 최적화가 가능하다. 예를 들어 AVX-128 ([[SSE]])를 Intrinsic을 사용하면 다음과 같이 표현할 수 있다. {{{#!syntax cpp #include extern void int32x4add(int *src1, int *src2, int *dest) { __m128i a = _mm_load_si128((__m128i *)src1); // vmovdqa xmm0, *src1 __m128i b = _mm_load_si128((__m128i *)src2); // vmovdqa xmm1, *src2 __m128i c = _mm_add_epi32(a, b); // vpaddd xmm2, xmm0, xmm1 _mm_store_si128((__m128i *)dest, c); // vmovdqa *dest, xmm2 return; // ret } }}} 위 코드는 니모닉과의 1:1 매칭을 위해 풀어서 쓴 것으로 실제로는 로드 명령을 생략하는 것이 가능하고 어셈블리의 경우 또한 로드 명령을 한 차례만 사용하는 것이 가능한데, 일반적으로 순수 어셈블리로 작성된 코드에 비해 Intrinsic을 사용한 코드의 경우 컴파일러가 코드 흐름에 따라 최적화가 가능하다는 장점이 있기 때문이다. 그리고 당연하지만 이렇게 Intrinsic 을 사용해 직접 최적화 하는 경우 어셈블리와 마찬가지로 이기종 프로세서와의 호환성이 없다. (ARM Neon != Intel AVX)저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기